package com.ticket.dao;

import java.util.List;

/**
 * 数据层接口
 * @Description:提供常用对增删改查功能
 */
public interface IDbDAO {

	/**
	 * 持久化一个对象
	 * 
	 * @param object
	 */
	public void persist(Object object);

	/**
	 * 更新一个对象
	 * 
	 * @param object
	 */
	public void merge(Object object);

	/**
	 * 移除一个对象
	 * 
	 * @param object
	 */
	public void remove(Object object);
	
	/**
	 * @Description：根据提示类型和id得到一个实体
	 * @date 2015年12月17日 下午2:13:43
	 * @param c
	 * @param id
	 */
	public <T> T get(Class<T> c, String id);
	
	/**
	 * @Description：执行原生sql的查询
	 * @param：@param sqlString sql语句
	 * @param：@param values sql占位符的的值
	 * @param：@return 返回查询的数据
	 * @throws
	 */
	public List<Object[]> executeSQLForQuery(String sqlString, Object...values);
	
	/**
	 * @Description：执行原生sql的查询并得到实体（暂时只支持一个实体）
	 * @param sqlString
	 * @param c
	 * @param values
	 * @return
	 */
	public <T> List<T> executeSQLForQuery(String sqlString, Class<T> c, Object...values);
	
	/**
	 * @Description：执行原生sql的查询并得到实体（暂时只支持一个实体）
	 * @param jpqlString jpqlString jpql语句
	 * @param c 返回的类型（只限返回一种实体的情况）
	 * @param start 分页查询的开始
	 * @param count 分页查询的条数
	 * @param values jpql占位符的的值
	 * @return 返回查询的数据
	 */
	public <T> List<T> executeSQLForQuery(String jpqlString, Class<T> c, Integer start, Integer count, Object...values);
	
	
	/**
	 * @Description：执行原生sql的查询并得到实体（暂时只支持一个实体）
	 * @param sqlString
	 * @param c
	 * @param values
	 * @return
	 */
	public <T> T executeSQLForQuerySingle(String sqlString, Class<T> c, Object...values);
	
	/**
	 * @Description：执行原生sql的更新
	 * @param：@param sqlString sql语句
	 * @param：@param values sql占位符的的值
	 * @param：@return 返回查询的数据
	 * @throws
	 */
	public int executeSQLForUpdate(String sqlString, Object...values);
	
	/**
	 * @Description：执行原生sql的更新
	 * @param：@param sqlString sql语句
	 * @param：@param values sql占位符的的值
	 * @param：@return 返回查询的数据
	 * @throws
	 */
	public int executeJPQLForUpdate(String sqlString, Object...values);
	
	/**
	 * @Description：执行原生sql返回单一值
	 * @param：@param sqlString sql语句
	 * @param：@param values sql占位符的的值
	 * @param：@return 返回查询的一个值
	 * @throws
	 */
	public String executeSQLForQuerySingle(String sqlString, Object...values);
	
	/**
	 * @Description：执行jpql的查询
	 * @param：@param jpqlString jpql语句
	 * @param：@param values jpql占位符的的值
	 * @param：@return 返回查询的数据
	 * @throws
	 */
	public List<Object> executeJPQLForQuery(String jpqlString, Object...values);
	
	/**
	 * @Description：执行jpql的查询
	 * @param：@param jpqlString jpql语句
	 * @param：@param values jpql占位符的的值
	 * @param：@return 返回查询的数据
	 * @throws
	 */
	public <T> List<T> executeJPQLForQuery(String jpqlString, Class<T> c, Object...values);

	/**
	 * @Description：
	 * @param：@param 
	 * @param：@param values 
	 * @param：@return 返回查询的数据
	 * @throws
	 */
	/**
	 * @Description：执行jpql的查询
	 * @param jpqlString jpqlString jpql语句
	 * @param start 分页查询的开始
	 * @param count 分页查询的条数
	 * @param values jpql占位符的的值
	 * @return
	 */
	public List<Object> executeJPQLForQuery(String jpqlString, Integer start, Integer count, Object...values);
	
	/**
	 * @Description：执行jpql的查询
	 * @param jpqlString jpqlString jpql语句
	 * @param c 返回的类型（只限返回一种实体的情况）
	 * @param start 分页查询的开始
	 * @param count 分页查询的条数
	 * @param values jpql占位符的的值
	 * @return 返回查询的数据
	 */
	public <T> List<T> executeJPQLForQuery(String jpqlString, Class<T> c, Integer start, Integer count, Object...values);
	
	/**
	 * @Description：执行jpql返回单一值
	 * @param：@param jpqlString jpql语句
	 * @param：@param values jpql占位符的的值
	 * @param：@return 返回查询的一个对象
	 * @throws
	 */
	public Object executeJPQLForQuerySingle(String jpqlString, Object...values);
	
	/**
	 * @Description：执行jpql返回单一值
	 * @param：@param jpqlString jpql语句
	 * @param：@param values jpql占位符的的值
	 * @param：@return 返回查询的一个对象
	 * @throws
	 */
	public <T> T executeJPQLForQuerySingle(String jpqlString, Class<T> c, Object...values);
}
